<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>2.开发一个模块管理引擎</title>
</head>

<body>
  <script>
    // 模块化历史
    // AMD 模式 Request.js CMD 阿里 sea.js
    // Commen.js 服务于Node
    // UMD 支持 AMD 和 COMD模式

    // 模块化关键点：
    // 1. 容器管理多个模块 2 可以定义添加模块 3 模块之间可以依赖

    // 立即执行函数，也可以用类的形式
    const moduleList = {};

    let module = (function () {
      // 存储模块的容器
      const moduleLists = {};


      // 定义模块
      function define (name, modules, action) {
        //取出依赖的模块
        modules.map((m, i) => {
          modules[i] = moduleLists[m];
        });
        //  向容器中压一个模块
        //  需要存储action执行的结果,不需要改变this，传空，依赖作为参赛传给action
        console.log(modules);
        moduleLists[name] = action.apply(null, modules);
      }
      return { define };
    })();
    // 参数 模块名字，依赖，具体的动作
    module.define('hd', [], function () {
      return {
        first (arr) {
          return
        },
        max (arr, key) {
          return arr.sort((a, b) =>  b[key] - a[key] )[0];
        }
      }

    });
    module.define('hd2', [], function () {
      return {

        min (arr, key) {
          return arr.sort((a, b) =>  a[key] - b[key] )[0];
        }
      }

    });
    module.define('lesson', ['hd', 'hd2'], function (...modules) {
      let data = [
        { name: 'js', price: 78 },
        { name: 'mysql', price: 66 },
        { name: 'mysql', price: 99 }
      ];
      console.log(modules[0].max(data, "price"), modules[1].min(data, "price"));
    });

  </script>
</body>

</html>